package main

import (
	"fmt"
	"math"
	"sort"
	"time"
)

// 实现对圆形、三角形、长方形求面积。
type Shape interface {
	Area() float64
}

type Circle struct {
	radius float64
}

func (c *Circle) Area() float64 {
	return math.Pi * c.radius * c.radius
}

type Triangle struct {
	base   float64
	height float64
}

func (t *Triangle) Area() float64 {
	return 0.5 * t.base * t.height
}

type Rectangle struct {
	length float64
	width  float64
}

func (r *Rectangle) Area() float64 {
	return r.length * r.width
}

// 3、分析斐波那契数列递推公式递归版本的问题，试着为该函数提供一个Cache，使其计算效率提升
var cache = make(map[int]int)

func fibonacci(n int) int {
	if n <= 1 {
		return n
	}
	// 检查缓存中是否已经计算过该斐波那契数
	if val, ok := cache[n]; ok {
		return val
	}
	// 计算斐波那契数并将结果存入缓存
	result := fibonacci(n-1) + fibonacci(n-2)
	cache[n] = result
	return result
}

func main() {
	fmt.Println("------1、实现对圆形、三角形、长方形求面积。-----")
	c := Circle{radius: 3}
	fmt.Printf("Circle area: %.2f\n", c.Area())

	t := Triangle{base: 4, height: 5}
	fmt.Printf("Triangle area: %.2f\n", t.Area())

	r := Rectangle{length: 6, width: 7}
	fmt.Printf("Rectangle area: %.2f\n", r.Area())
	fmt.Println("------2、利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列-----")
	// 创建图形切片
	shapes := []Shape{
		// Circle{radius: 5},
		// Triangle{base: 4, height: 3},
		// Rectangle{length: 6, width: 8},
		// 添加更多的图形对象
		&c,
		&t,
		&r,
	}
	// 计算每个图形的面积
	areas := make([]float64, len(shapes))
	for i, shape := range shapes {
		areas[i] = shape.Area()
	}
	// sort.Slice(shapes, func(i, j int) bool {
	// 	return shapes[i].Area() > shapes[j].Area()
	// })
	// for i, v := range shapes {
	// 	fmt.Printf("降序排序第%d为：%.2f\n", i+1, v.Area())
	// }
	// 按面积降序排序
	sort.Slice(areas, func(i, j int) bool {
		return areas[i] > areas[j]
	})
	// 打印降序后的图形面积
	for _, area := range areas {
		fmt.Printf("面积：%0.2f", area)
	}
	fmt.Println("------3、分析斐波那契数列递推公式递归版本的问题，试着为该函数提供一个Cache，使其计算效率提升-----")
	n := 10
	fmt.Printf("Fibonacci(%d) = %d\n", n, fibonacci(n))
	fmt.Println(`------4、8年前的今天上午9点30分
	要求：
	1. 毫秒时间戳是多少？
	2. 格式化输出时间为 2005/09/10 21:35:40 +0800 的形式
	3. 请问那天是周几？到那天，本年已经过了多少周？
	4. 距离今天已经过了多少天了？-----`)
	// 获取当前时间
	// now := time.Now()

	// 计算8年前的时间
	// eightYearsAgo := now.AddDate(-8, 0, 0)
	// 1.毫秒时间戳
	t1 := time.Date(2015, time.July, 14, 9, 30, 0, 0, time.UTC)
	milliseconds := t1.UnixNano() / int64(time.Millisecond)
	// milliseconds := eightYearsAgo.UnixNano() / int64(time.Millisecond)
	fmt.Println("毫秒时间戳：", milliseconds)

	// 2.格式化输出时间
	formattedTime := t1.Format("2005/09/10 21:35:40 +0800")
	// formattedTime := eightYearsAgo.Format("2005/09/10 21:35:40 +0800")
	fmt.Println("格式化输出时间：", formattedTime)

	// 3.那天是星期几和本年过了多少周
	weekday := t1.Weekday().String()
	// weekday := eightYearsAgo.Weekday().String()
	// weekPassed := int(eightYearsAgo.YearDay() / 7)
	weekPassed := t1.YearDay() / 7
	fmt.Println("那天是星期几：", weekday)
	fmt.Println("本年已经过了多少周", weekPassed)

	// 4.距离今天已经过了多少天
	// daysPassed := now.YearDay() - eightYearsAgo.YearDay()
	daysPassed := time.Since(t1).Hours() / 24
	fmt.Println("距离今天已经过了多少天", daysPassed)

}

// 阿飞老师的批改
// 1. 这个地方有一个最大的坑就是格式化字符串这里，必须使用"2006/01/02 15:04:05 -0700"
//    这个也算是golang的一个特色吧。
// 2. 初始化的日期不要固定死。
